import axios from 'axios'
import { throwErr } from '@/utils' // utils 捕捉服务端http状态码的方法
import store from '@/store' // 引入vuex的相关操作
import { Message } from 'element-ui' // element Toast的提示
import router from '@/router'

// 过滤请求
axios.interceptors.request.use(config => {
  // config 为请求的一些配置
  config.timeout = 10 * 1000 // 请求响应时间
  return config
}, error => {
  return Promise.reject(error)
})

// 添加响应拦截器
axios.interceptors.response.use(
  response => {
    if (response.data.code === 401) { // 服务端定义的响应code码为401时为未登录
      store.dispatch('setUserInfo', {})
      Message({
        message: '未登录'
      })
      router.push('/login')
      return Promise.reject(response) // 使用Promise.reject 抛出错误和异常
    }
    return Promise.resolve(response)
  },
  error => {
    if (error && error.response) {
      let res = {}
      res.code = error.response.status
      res.msg = throwErr(error.response.status, error.response) // throwErr 捕捉服务端的http状态码 定义在utils工具类的方法
      return Promise.reject(res)
    }
    return Promise.reject(error)
  }
)

export default function request (method, url, data) { // 暴露 request 给我们好API 管理
  method = method.toLocaleLowerCase() // 封装RESTful API的各种请求方式 以 post get delete为例
  if (method === 'post') {
    return new Promise((resolve, reject) => {
      axios.post(url, data)
        .then(response => {
          resolve(response)
        }).catch(error => {
          reject(error)
        })
    })
  } else if (method === 'get') {
    return new Promise((resolve, reject) => {
      axios.get(url, {
        params: data
      }).then(response => {
        resolve(response)
      }).catch(error => {
        reject(error)
      })
    })
  } else if (method === 'delete') {
    return new Promise((resolve, reject) => {
      axios.delete(url, {
        params: data
      }).then(response => {
        resolve(response)
      }).catch(error => {
        reject(error)
      })
    })
  }
}
